package com.zhuhjay.service.system.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zhuhjay.common.web.model.vo.PageInfoVo;
import com.zhuhjay.service.system.model.domain.FileInfo;
import com.zhuhjay.service.system.model.dto.FileChunkDto;
import com.zhuhjay.service.system.model.dto.MdChunkDto;
import com.zhuhjay.service.system.model.entity.SystemFile;
import com.zhuhjay.service.system.model.vo.CheckChunkVo;
import com.zhuhjay.service.system.model.vo.DirInfoVo;
import com.zhuhjay.service.system.model.vo.FilesCounterInfoVo;
import com.zhuhjay.service.system.model.vo.MdFileInfoVo;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * <p>
 * 服务类
 * </p>
 *
 * @author Zhuhjay
 * @since 2023-02-07
 */
public interface SystemFileService extends IService<SystemFile> {

    /**
     * 检查文件是否已上传
     *
     * @param dirId     文件夹id
     * @param chunkInfo 文件分片信息
     * @return 检查结果
     */
    CheckChunkVo check(String dirId, FileChunkDto chunkInfo);

    /**
     * 文件上传
     *
     * @param dirId     文件夹id
     * @param chunkInfo 文件分片信息
     */
    void fileUpload(String dirId, FileChunkDto chunkInfo);

    /**
     * 文件移动
     *
     * @param fileIds 文件id列表
     * @param dirId   文件夹id
     */
    void copy(List<String> fileIds, String dirId);

    /**
     * 文件拷贝
     *
     * @param fileIds 文件id列表
     * @param dirId   文件夹id
     */
    void move(List<String> fileIds, String dirId);

    /**
     * 根据文件id列表删除文件到回收站
     * @param fileIds 文件id列表
     */
    void delete2Recycle(List<String> fileIds);

    /**
     * 文件重命名
     *
     * @param fileId 文件id
     * @param name   新文件名
     */
    void rename(String fileId, String name);

    /**
     * 文件下载
     *
     * @param id       文件id
     * @param request  请求对象
     * @param response 响应对象
     */
    void downloadFile(String id, HttpServletRequest request, HttpServletResponse response);

    /**
     * 文件预览
     *
     * @param id       文件id
     * @param request  请求对象
     * @param response 响应对象
     */
    void previewFile(String id, HttpServletRequest request, HttpServletResponse response);

    /**
     * 文件系统统计
     *
     * @return 统计结果
     */
    FilesCounterInfoVo counter();

    /**
     * markdown文件上传
     *
     * @param dirId     文件夹id
     * @param chunkInfo 文件分片信息
     * @return 文件信息(如果是新建文件, 那么这个很有必要)
     */
    MdFileInfoVo markdownUpload(String dirId, MdChunkDto chunkInfo);

    /**
     * markdown文件下载
     *
     * @param fileId 文件id
     * @return 文件信息
     */
    MdFileInfoVo markdown(String fileId);

    /**
     * markdown文件分页列表
     *
     * @param pageNum  页码
     * @param pageSize 每页大小
     * @return markdown分页列表
     */
    PageInfoVo<MdFileInfoVo> markdownPage(Integer pageNum, Integer pageSize);

    /**
     * 回收站文件
     * @return 回收站文件信息
     */
    DirInfoVo recycleList();

    /**
     * 回收站文件还原
     * @param fileIds 文件id列表
     */
    void recycleRestore(List<String> fileIds);

    /**
     * 回收站文件彻底删除
     * @param fileIds 文件id列表
     */
    void recycleDelete(List<String> fileIds);
}
